#include <iostream>
#include<stdio.h>
#define MaxSize 30
using namespace std;
typedef struct SNode{
	char data[MaxSize];
	int top;
}*Stack;
void Create(Stack &s);
void Push(Stack &s,char str[]);
void Pop(Stack &s,char &e);
void trans(Stack &s,char str[]);
int main()
{
	int i=0;
	Stack S;
	Create(S);
	char str[MaxSize];
	gets(str);
	trans(S,str);
	return 0;
}
void Create(Stack &s)
{
	s=new SNode;
	s->top=-1;
}
void Push(Stack &s,char c)
{
	if (s->top==MaxSize-1)
		return ;
		s->top++;
		s->data[s->top]=c;
}
void Pop(Stack &s,char &e)
{
	if (s->top==-1)
		e='\0';
	else{
		e=s->data[s->top];
		s->top--;
	}	
}
void trans(Stack &s,char str[])
{
	char e,ch[21];
	int i=0,j=0;
	while(str[i])
	{
		switch(str[i])
		{
			case'(':
				Push(s,'(');
				i++;
				break;
			case')':
				Pop(s,e);
				while(e!='(')
				{
					ch[j++]=e;
					ch[j++]=' ';
					Pop(s,e);
				}
				i++;
				break;
			case'+':
			case'-':
				if(i==0||str[i-1]=='(')
				{
					if(str[i]=='-')
					ch[j++]=str[i];
					i++;
					break;
				}
				while(s->top!=-1)
				{
					e=s->data[s->top];
					if(e!='(')
					{
						ch[j++]=e;
						ch[j++]=' ';
						Pop(s,e);
					}
					else
					    break;
				}
				Push(s,str[i]);
				i++;
				break;
			case'*':
			case'/':
				while(s->top!=-1)
				{
					e=s->data[s->top];
					if(e=='*'||e=='/')
					{
						ch[j++]=e;
						ch[j++]=' ';
						Pop(s,e);
					}
					else
					    break;
				}
				Push(s,str[i]);
				i++;
				break;
			default:
				while((str[i]>='0'&&str[i]<='9')||str[i]=='.')
				{
					ch[j++]=str[i];
					i++;
				}
				ch[j++]=' ';
		}
	}
	while(s->top!=-1)
	{
		Pop(s,e);
		ch[j++]=e;
		ch[j++]=' ';
	}
	ch[j-1]='\0';
	for(i=0;ch[i];i++)
	printf("%c",ch[i]);
}
